package com.qf.hsr.demo02;

import com.qf.hsr.demo01.UserServiceImpl;
import com.qf.hsr.demo01.IUserService;
import jdk.nashorn.internal.ir.CallNode;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author q
 * @version V1.0
 * @date 2021/11/06
 **/
public class Application {

    public static void main(String[] args) {

        ApplicationContext applicationContext =  new ClassPathXmlApplicationContext("applicationContext.xml");

        //真实角色
        UserServiceImpl userService = (UserServiceImpl) applicationContext.getBean("userService");
        //代理角色，不存在
        ProxyInvocationHandler pih = new ProxyInvocationHandler();
        //设置要代理的对象
        pih.setTarget(userService);
        //动态生成代理类
        IUserService proxy = (IUserService) pih.getProxy();

        proxy.update();

    }

    //为什么会自动调用InvocationHandlerImpl的invoke方法？
    //因为JDK生成的最终真正的代理类，它继承自Proxy并实现了我们定义的Subject接口，
    //在实现Subject接口方法的内部，通过反射调用了InvocationHandlerImpl的invoke方法。

    //1.通过实现 InvocationHandler 接口创建自己的调用处理器；
    //2.通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类；
    //3.通过反射机制获得动态代理类的构造函数，其唯一参数类型是调用处理器接口类型；
    //4.通过构造函数创建动态代理类实例，构造时调用处理器对象作为参数被传入。

}
